﻿Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.Text
Imports System.Data  
Imports System.IO




Public Class CSGeneralDistribLiq


Private  RUTAARCHIVO      As String 
Private  NOMBREARCHIVO    As String 
Private  TLOADERCOMMAND   As String 
Private  PARAMTLOADER     As String
Private  PARAMTLOADERBANC As String
Private  USUARIOTLOADER   As String


Private Const __ARCHIVO_TLOK__        As String = ".tl.ok"
Private Const __ARCHIVO_TLERR_TEXT__  As String = ".tl.err_text"
Private Const __ARCHIVO_TLOK_TEXT__   As String = ".tl.ok_text"


Public  Const __MONTO_TOLERANCIA_REMAMENTE_MINIMO_X_FONDO__ As Decimal = 2000




Public Enum ESTADOTRANSDISTRIB

  COMPLETA = 0
  ENVIADA_A_DECALOG = 1
  INFO_ALMACENADA_FRIDA = 2
  NO_EJECUTADA = 3
  DESCONOCIDO = 4
  INFO_NO_ALMACENADA_FRIDA = 5
End Enum




  Public Sub New()        
         CargarParametrosLiquidez(RUTAARCHIVO,NOMBREARCHIVO,TLOADERCOMMAND,PARAMTLOADER,PARAMTLOADERBANC, USUARIOTLOADER)     
   End Sub


Public Function  ValidaInstrumento(ByVal nomInstrumento As String, ByRef numInstrumento As Integer, ByRef msgError As String) As Boolean
    If Not nomInstrumento.Trim() .Equals("") Then
        Dim dt As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneInstrumento(nomInstrumento)
        If dt is Nothing Then 
            msgError = "No existe instrumento vigente en decalog con nombre " & nomInstrumento
            Return False
        End If

        If dt.Rows.Count() > 1 Then
            msgError = "Existe mas de un instrumento vigente en decalog con nombre " & nomInstrumento
            Return False
        End If

        If dt.Rows.Count() = 0 Then 
            msgError = "No existe instrumento vigente en decalog con nombre " & nomInstrumento
            Return False
        End If
        numInstrumento = Convert.ToInt32(dt.Rows(0)("INST_NUM"))
        Return True
    Else
            Return False
    End If
End Function


Public Function  ObtenerPSLiberadasyDistribDeBSO() As List(Of CTPartidaSolicitud)  
  Return BSO.LstPS.FindAll(Function(x) x.EstatusActualPS = CTPartidaSolicitud.enumEstatusPS.LIBERADA or x.EstatusActualPS = CTPartidaSolicitud.enumEstatusPS.EN_DISTRIBUCION)
End Function

Public Function  ObtenerNumPSLiberadasyDistribDeBSO() As Long 
  Dim numPS As Long = 0

  Try 
     numPS =  BSO.LstPS.FindAll(Function(x) x.EstatusActualPS = CTPartidaSolicitud.enumEstatusPS.LIBERADA or x.EstatusActualPS = CTPartidaSolicitud.enumEstatusPS.EN_DISTRIBUCION).Count 
  Catch ex As Exception
     numPS = 0 
  End Try
  Return numPS 
End Function

Public Function  ObtenerNumDeAjustesBSO() As Long 
  Dim numPAJ As Long = 0

  Try 
     numPAJ =  BSO.LstPAJ.FindAll(Function(x) x.Estatus  = CTPartidaAjuste.enumEstatusPAJ.APLICADA or x.Estatus  = CTPartidaAjuste.enumEstatusPAJ.CANCELADA_ACEPTADA).Count 

      
  Catch ex As Exception
     numPAJ = 0 
  End Try
  Return numPAJ
End Function


Public Function ExistenIntermediariosSimilares(ByRef ps As CTPartidaSolicitud ) As Boolean 
 Dim idIntermediario As Integer = 0
 Dim tasa            As Decimal = 0.0
 Dim lstAuxPej       As List(Of CTPartidaEJ)
 Dim resultado        As Boolean = false 

 
 For Each pej As CTPartidaEJ In ps.LstPEJ 
   idIntermediario = pej.Intermediario.IdIntermediario 
   tasa            = pej.Tasa   
   lstAuxPej = ps.LstPEJ.FindAll (Function(x) x.Intermediario.IdIntermediario = idIntermediario and x.Tasa = tasa)

   If lstAuxPej.Count > 1 then 
      resultado = True 
      Exit For 
   End If

 Next

 Return resultado 


End Function


Public Function ObtenerMontosDeDistribXPEJ(ByVal idPEJ As long, ByRef sMsgError As String) As Decimal () 
 Dim montos(2) As Decimal  
 Dim dt        As DataTable 

     dt = CFLServicioLocalSQLServerDB.ObtenerMontosInterDistribDB (idPEJ ) 
     If not dt is Nothing then 
       montos(0)  = dt.Rows(0)("TOTAL")
       montos(1)  = dt.Rows(0)("CANTIDAD_DISTRIB")
       montos(2)  = dt.Rows(0)("CANTIDAD_X_DISTRIB")

     else

       montos(0)  = 0
       montos(1)  = 0
       montos(2)  = 0

       sMsgError = "Es probable que no se hayan obtenido los importes del intermediario seleccionado, vuelva a intentarlo. "

     End If

  Return montos 

End Function


Public Function ObtenerMontoDeDistribXPEJDePAJ(ByVal idPEJ As long, ByRef sMsgError As String) As Decimal 
 Return   CFLServicioLocalSQLServerDB.ObtenerMontosInterXPAJsDistribDB(idPEJ,sMsgError)
End Function





Public Function  ObtenerFondosXintermediarioYTVNGDB(ByVal idIntermediario As Integer, ByVal idTvng As Integer,ByRef sMsgError As String) As List(Of CTFondoXIntermediario )
Dim dtFondoInter    As DataTable 
Dim lstFondosXInter = New  List(Of CTFondoXIntermediario )

   dtFondoInter = CFLServicioLocalSQLServerDB.ObtenerFondosXintermediarioYTVNGDB(idIntermediario,idTvng ,sMsgError ) 

   If Not sMsgError.Equals("") then 
     Return Nothing 
     Exit Function 
   End If


   For Each fondo As DataRow In dtFondoInter.Rows 
       lstFondosXInter.Add (New CTFondoXIntermediario (fondo("FONDO"),idIntermediario ,fondo("CTO_INTERMEDIARIO")))
   Next

   Return lstFondosXInter 

End Function

Public Function ObtenerSaldosXFondoXInter(ByRef lstFondos As list (Of CTFondoXIntermediario), _
                                          ByRef SaldoEstimado As CTDistribLiqReduc, _
                                          ByRef distrib As CTDistribLiqReduc, _
                                          ByRef lstComisiones As List(Of CTComisionFondo) ) As List(Of CTFondosDistribLiq)



Dim lstFondosInter        As New List(Of CTFondosDistribLiq)

Dim dtFondoSalDiso        As New DataTable()
Dim dtOrdenesPend         As New DataTable()
Dim dtPendingCashAndAjust As New DataTable()

Dim strTipoActMinus       As String = "PE-"
Dim strTipoActPlus        As String = "PE+"

Dim ToleranciaRemMinXFondo  As Decimal 



Dim servicioGral As New CServiciosGenerales() 


  '1) Se obtiene el monto de Tolerancia de Remanente Mínimo X Fondo

     Try
         ToleranciaRemMinXFondo = Convert.ToDecimal (  CServicioLocalSQLServerDB.ObtenerTolRemMinXFondo() )
     Catch ex As Exception
         ToleranciaRemMinXFondo = __MONTO_TOLERANCIA_REMAMENTE_MINIMO_X_FONDO__
     End Try
     
     

   '2) Se Obtiene el Saldo de los fondos
    Try       
         dtFondoSalDiso = CServiciosMacrosSyBaseDB.FondosSalLiquidezDB(lstFondos)       
    Catch ex As Exception       
        Throw ex
    End Try




    '3) Se obtiene las ordenes pendientes 

    Dim ColumnaClavesOrd(0) As DataColumn
    Try
       
       dtOrdenesPend = CServiciosMacrosSyBaseDB.OrdenesPendLiquidezDB(lstFondos)
       ColumnaClavesOrd(0) = dtOrdenesPend.Columns("PFCOD")
       dtOrdenesPend.PrimaryKey = ColumnaClavesOrd      
    Catch ex As Exception       
       Throw ex
    End Try




    '4) Se obtiene el pending-cash-ajust

    Dim ColumnaClaves(1) As DataColumn
    Try
       
       dtPendingCashAndAjust = CServiciosMacrosSyBaseDB.PendingCashAndAjustDB(lstFondos)
       ColumnaClaves(0) = dtPendingCashAndAjust.Columns("PF_COD")
       ColumnaClaves(1) = dtPendingCashAndAjust.Columns("XACT_TYP")
       dtPendingCashAndAjust.PrimaryKey = ColumnaClaves
               
    Catch ex As Exception       
      Throw ex
    End Try



    

     Dim registro             As DataRow
     Dim dblSaldo             As Double = 0.0
     Dim dblPendingCash       As Double = 0.0
     Dim dblPendingCashAjust  As Double = 0.0
     Dim dblOrdPend           As Double = 0.0
     Dim dblSalDecalog        As Double = 0.0


     lstFondosInter.Clear()

    Try
    
     For Each registro In dtFondoSalDiso.Rows
             Dim valores(1) As Object
             Dim registrosMinus As DataRow
             Dim registrosPlus As DataRow
             Dim registroOrd As DataRow



             'Busqueda de registros
             valores(0) = registro.Item("fondo")
             valores(1) = strTipoActMinus
             registrosMinus = dtPendingCashAndAjust.Rows.Find(valores)

             valores(1) = strTipoActPlus
             registrosPlus = dtPendingCashAndAjust.Rows.Find(valores)

             registroOrd = dtOrdenesPend.Rows.Find(registro.Item("fondo"))


             'Validación en caso de no encontrar

             If Not registro.Item("saldo") Is Nothing Then
                 dblSaldo = registro.Item("saldo")
             End If


             If Not registrosMinus Is Nothing Then
                 dblPendingCash = registrosMinus.Item("SALDOSPLUSMINUS")
             End If

              If Not registrosPlus Is Nothing Then
                 dblPendingCashAjust = registrosPlus.Item("SALDOSPLUSMINUS")
             End If


              If Not registroOrd Is Nothing Then
                 dblOrdPend = registroOrd.Item("ORDREPO")
             End If


             'PENDIENTE: VALIDAR SI registro.Item("saldo") puede ser NULL
             dblSalDecalog = registro.Item("saldo") - dblOrdPend + dblPendingCash + dblPendingCashAjust



             'Obtener el monto distribuido 
             Dim montoDistribuido As Decimal = 0
             If Not distrib is Nothing then
                 Dim  montoFondo As CTDistribLiqReduc.structDistribFondoXInter    
                 montoFondo = distrib.LstDistrib.Find (Function (x) x.CodFondo.Equals (registro.Item("fondo")) )                
                 montoDistribuido = montoFondo.MontoDistrib                                 
             End If


             'Obtener comisiones (Cargo y/o Abonos)
             Dim ComisionFondo As CTComisionFondo = Nothing  
             Dim Cargo         As Decimal = 0  
             Dim Abono         As Decimal = 0

             If Not lstComisiones is Nothing then 
                If lstComisiones.Count > 0 then 
                   ComisionFondo = lstComisiones.Find(Function(x) x.Fondo.Equals(registro.Item("fondo"))) 
                End If
                If not ComisionFondo is Nothing 
                   Cargo = ComisionFondo.Cargo
                   Abono = ComisionFondo.Abono 
                End If
             End If
             

             lstFondosInter.Add(New CTFondosDistribLiq(registro.Item("fondo"), dblSaldo, dblOrdPend, dblPendingCash, dblPendingCashAjust, dblSalDecalog,SaldoEstimado,montoDistribuido,ToleranciaRemMinXFondo,Cargo,Abono))

             dblSaldo = 0.0
             dblPendingCash = 0.0
             dblPendingCashAjust = 0.0
             dblOrdPend = 0.0
             dblSalDecalog = 0.0

         Next

         

    Catch ex As Exception               
        Throw ex
    End Try

    
    Return lstFondosInter


End Function


public function ObtenerImporteTotal(ByVal col As Integer, byRef miLista As List(Of CTFondosDistribLiq) )  as Decimal 
    
    Dim i As Integer     
    Dim sumaTotal As decimal = 0.0
    Dim lstDetalle As new List(Of CTFondosDistribLiq )

    Try
        lstDetalle = miLista.FindAll (Function (x)  not x.Columna (col).ToString.Trim().Equals (""))
                                                    
        For i = 0 to lstDetalle.Count - 1
             sumaTotal +=   Convert.ToDouble  (lstDetalle(i)(col))
        Next

        Return sumaTotal 
    Catch ex As Exception
        Throw ex 
    End Try
    
End Function



Public Function GenerarArchivoFondeoReportos(ByRef InterADistrib As CTDistribLiqReduc, _
                                             ByVal nombreArchivo As String, _
                                             ByVal rutaArchivo   As String, _
                                             ByRef nombreArchivoSalida As String, _
                                             ByVal fechaHoy      As String, _
                                             ByVal fechasig      As String, _
                                             ByVal opcion        As CDefinicionesGrales.FLLiqTipoValorNegocio, _
                                             ByRef SecuenciaArchivo As String, _
                                             ByRef eventoBit As CSBitEvento) As Integer

Dim dt     As DataSet
Dim dr     As DataRow()
Dim filtro As String

Dim lstFondosXDistrib as List(Of CTDistribLiqReduc.structDistribFondoXInter) 



Dim cabecera As New System.Text.StringBuilder
Dim valores  As New System.Text.StringBuilder


Dim i As Integer


  Try
        

    dt = CServiciosMacrosSyBaseDB.LayoutLiquidezXML(eventoBit)

    '1. Cabecera inicial

        filtro = "tipo='1'"
        dr = dt.Tables.Item(0).Select(filtro)

        For i = 0 To dr.Count - 1
            cabecera.Append(dr(i).Item("header").ToString())
            cabecera.Append(",")

          

            If dr(i).Item("valor").ToString().Equals("##") Then
               valores.Append(fechaHoy)
            Else

                 If dr(i).Item("header").ToString().Equals ("ORDR_BLOCK_PF") and opcion = CDefinicionesGrales.FLLiqTipoValorNegocio.GUBER_PORVENIR   then 'DISTINCIÓN ENTRE LA MACRO DE LIQUIDEZ Y PORVENIR
                      valores.Append("PORVENIR")  
                  else
                      valores.Append(dr(i).Item("valor").ToString())
                 End If               
            End If

            valores.Append(",")
        Next





   '2. Detalle

        filtro = "tipo='2'" 
        dr = dt.Tables.Item(0).Select(filtro)
        

        If InterADistrib.LstDistrib.Count   <= 0 Then
           nombreArchivoSalida = ""
           Return -1
        End If


        lstFondosXDistrib = InterADistrib.LstDistrib.FindAll(Function(x) x.MontoDistrib > 0 ) 

        if lstFondosXDistrib.Count <= 0 then 
           nombreArchivoSalida = ""
           Return -1
        End If


        For i = 0 To lstFondosXDistrib.Count - 1

           cabecera.Append(dr(0).Item("header").ToString())
           cabecera.Append(",")

           cabecera.Append(dr(1).Item("header").ToString())
           cabecera.Append(",")

           cabecera.Append(dr(2).Item("header").ToString())
           cabecera.Append(",")


           valores.Append(dr(0).Item("valor").ToString())
           valores.Append(",")

           valores.Append(lstFondosXDistrib(i).CodFondo)   'Fondo 
           valores.Append(",")

           valores.Append(lstFondosXDistrib(i).MontoDistrib ) 'Importe
           valores.Append(",")

        Next


     'Cabecera Final

        filtro = "tipo='3'"
        dr = dt.Tables.Item(0).Select(filtro)

        For i = 0 To dr.Count - 1
            cabecera.Append(dr(i).Item("header").ToString())
            cabecera.Append(",")

            If dr(i).Item("valor").ToString().Equals("##") Then
               valores.Append(fechasig )
            Else
               valores.Append(dr(i).Item("valor").ToString())
            End If
            valores.Append(",")

        Next

        cabecera.Remove(cabecera.Length - 1, 1)
        valores.Remove(valores.Length - 1, 1)

        dt.Clear()


       'Crear el archivo 

       Dim nombreArchivoCompleto As String = nombreArchivo & Today.Day & Today.Month & Today.Year & Date.Now.Hour & Date.Now.Minute & Date.Now.Second & "_" & SecuenciaArchivo & "_TIPO_" & opcion & ".csv"

       

       Using sw As StreamWriter = File.CreateText(rutaArchivo & nombreArchivoCompleto)
           sw.WriteLine(cabecera.ToString())
           sw.WriteLine(valores.ToString())
           sw.Close()
       End Using


       nombreArchivoSalida = nombreArchivoCompleto

       Return 0

Catch ex As Exception
  Dim errorBit = eventoBit.GuardarError("Error al crear archivoRF TLOADER: idPEJ" & InterADistrib.IdPEJ & " - " & ex.Message)
  nombreArchivoSalida = ""
  Throw New Exception(ex.Message & " -Codigo:" & errorBit.IdError)
End Try


  Return 0

End Function

Public Function GenerarArchivoFondeoBancarios(ByRef intermediario  As CTDistribLiqReduc, _
                                              ByVal numInstrumento As Long, _
                                              ByRef nombreArchivoCompleto As String, _
                                              ByVal fechaHoy       As String, _
                                              ByRef ps As CTPartidaSolicitud, _
                                              ByRef SecuenciaArchivo As String, _
                                              ByRef eventoBit As CSBitEvento) As Integer

        Try
            nombreArchivoCompleto = NOMBREARCHIVO & Today.Day & Today.Month & Today.Year & Date.Now.Hour & Date.Now.Minute & Date.Now.Second & "_" & SecuenciaArchivo & "_TIPO_" & ps.TvngId.ToString() & ".tl"
            Dim vn As Integer = 1
            Dim idPej = intermediario.IdPEJ
            Dim tasa As Double = BSO.LstPEJ.Find(Function(x) x.PartidaEJId = idPej).Tasa /100
            Dim plazo As Integer = ps.Plazo
            Dim precio As Double = vn / (1+tasa/360*plazo)
            Dim aux = precio.ToString("#.0000000000")
            aux = aux.Substring(0, aux.Length - 2)
            precio = Convert.ToDouble(aux)

            Using sw As StreamWriter = File.CreateText(RUTAARCHIVO & nombreArchivoCompleto)
                sw.WriteLine("1" & vbTab & "ENTITE" & vbTab & "ID_ORDER")
                sw.WriteLine("1" & vbTab & "INST_NUM" & vbTab & numInstrumento.ToString())
                sw.WriteLine("1" & vbTab & "ORDR_TYP" & vbTab & "MP")
                sw.WriteLine("1" & vbTab & "QUOTE_MOD" & vbTab & "T")
                sw.WriteLine("1" & vbTab & "MAX_PRICE" & vbTab & "1")
                sw.WriteLine("1" & vbTab & "MIN_PRICE" & vbTab & "0")
                sw.WriteLine("1" & vbTab & "XACT_TYP" & vbTab & "CDD")
                sw.WriteLine("1" & vbTab & "ORDR_VALID_DAT" & vbTab & fechaHoy)
                sw.WriteLine("1" & vbTab & "GER_DESK" & vbTab & "FM:DEUDA")
                sw.WriteLine("1" & vbTab & "ORDR_BLOCK" & vbTab & "B")
                sw.WriteLine("1" & vbTab & "AMT_FLG" & vbTab & "N")
                sw.WriteLine("1" & vbTab & "SETTLE_DAT" & vbTab & fechaHoy)
                sw.WriteLine("1" & vbTab & "FACTOR" & vbTab & "1")
                For Each dist As CTDistribLiqReduc.structDistribFondoXInter In intermediario.LstDistrib
                    sw.WriteLine("1" & vbTab & "ENTITE_PF" & vbTab & "ID_PF")
                    sw.WriteLine("1" & vbTab & "PF_COD" & vbTab & dist.CodFondo)
                    Dim titulos As Integer = 0
                    aux = (dist.MontoDistrib / precio).ToString("#.0")
                    aux = aux.Substring(0, aux.Length - 2)
                    titulos = Convert.ToInt64(aux)
                    sw.WriteLine("1" & vbTab & "QTY_REQUESTED" & vbTab & titulos.ToString())
                Next
                sw.Close()       
            End Using
        Catch ex As Exception
            Dim errorBit = eventoBit.GuardarError("Error al crear archivoRV TLOADER: idPEJ" & intermediario.IdPEJ & " - " & ex.Message)
            Throw New Exception(ex.Message & " -Codigo:" & errorBit.IdError)
        End Try

  Return 0

End Function

Public Sub CargarParametrosLiquidez(ByRef rutaArchivo As String, ByRef nomArchivo As String, ByRef comandoTLoader As String, ByRef paramCom As String, ByRef paramComBanc As String, ByRef usarioTloader As String)

   Dim serGral as new  CServiciosGenerales 
   

     
   nomArchivo       = serGral .ObtenerPREFIJOARCHIVO &  CServicioLocalSQLServerDB.ObtenerNombreArchivoLiquidez  ()
   rutaArchivo      = CServicioLocalSQLServerDB.ObtenerRutaArchivoLiquidez ()    
   comandoTLoader   = CServicioLocalSQLServerDB.ObtenerNombreComandoTLoader ()  

   paramCom         = CServicioLocalSQLServerDB.ObtenerParamComandoTLoaderLiq() 
   
   paramComBanc     = CServicioLocalSQLServerDB.ObtenerParamComandoTLoaderLiqBanc()
   
   usarioTloader = "TLOADER"
   If Not CServicioLocalSQLServerDB.ObtenerParamUsuarioTLoader().Equals("1") Then
        usarioTloader = CServiciosMacrosSyBaseDB.USUARIO
   End If
   
End Sub


Public function EjecutarProceso (ByVal comando As String, ByVal argumentos As String, ByRef eventoBit As CSBitEvento) As Boolean 

        Dim proceso As New Process()


        Dim idRegBit As Integer  


        Try
            proceso.EnableRaisingEvents = True
            proceso.StartInfo.FileName = comando
            proceso.StartInfo.Arguments = argumentos
            proceso.Start()
            idRegBit = CUtileria.GrabarBitacora("Liquidación-Porvenir", "T-Loader", "Se envía el archivo al T-Loader, proceso ID: " & proceso.Id)
            proceso.Close ()                         
            CUtileria.CompletarRegBitacora (idRegBit)  
            
            Return True  

        Catch ex As Exception
             Dim errorBit = eventoBit.GuardarError("Error TLOADER: " & ex.Message)
             idRegBit =  CUtileria.GrabarBitacora ("Liquidación-Porvenir","T-Loader",ex.Message )
             CUtileria.CompletarRegBitacora (idRegBit)  
             Return false
        End Try

    
End Function 


Public Function GuardarFondeoReportosXIntermediario(ByRef Intermediario As CTDistribLiqReduc, ByRef ps As CTPartidaSolicitud, ByRef sMsgError As String) As  ESTADOTRANSDISTRIB


 Try

            If AlmacenarInfoDistribXIntermediario(Intermediario,sMsgError) = False 
               sMsgError = "La información de la distribución para la PEJ " & Intermediario.IdPEJ & ", no pudo ser almacenada debido a " & sMsgError & "; pero es muy probable que la óden se haya generado en Decalog."
               Return ESTADOTRANSDISTRIB.INFO_NO_ALMACENADA_FRIDA                  
            End If

            Return ESTADOTRANSDISTRIB.INFO_ALMACENADA_FRIDA 

    Catch ex As Exception
      sMsgError = ex.Message      
      Return ESTADOTRANSDISTRIB.DESCONOCIDO 
    End Try



End Function

Public Function FondeoReportosXIntermediario(ByRef Intermediario As CTDistribLiqReduc, ByRef ps As CTPartidaSolicitud, ByRef ArchivoSal As String, ByRef SecuenciaArchivo As String, ByRef sMsgError As String, ByRef eventoBit As CSBitEvento) As  ESTADOTRANSDISTRIB

Dim sFechaSol     as String 
Dim sFechaLiq     as String 
ArchivoSal = ""    


 sFechaSol = Ps.FecSol.ToString ("dd-MM-yyyy")
 sFechaLiq = Ps.FecLiq.ToString ("dd-MM-yyyy")

 Try

       If  GenerarArchivoFondeoReportos (intermediario, _
                                         NOMBREARCHIVO, _
                                         RUTAARCHIVO,   _
                                         ArchivoSal,    _
                                         sFechaSol,     _
                                         sFechaLiq,     _
                                         Ps.TvngId,
                                         SecuenciaArchivo, eventoBit) = 0 then 


           If  ejecutarProceso(RUTAARCHIVO  & TLOADERCOMMAND, PARAMTLOADER.Replace("@Usuario", USUARIOTLOADER).Replace ("@archivosalida",RUTAARCHIVO & ArchivoSal), eventoBit) =False 
               sMsgError = "Fallo en el envio a Decalog."
               Return ESTADOTRANSDISTRIB.NO_EJECUTADA 
           End If
           

            Return ESTADOTRANSDISTRIB.ENVIADA_A_DECALOG 

        else
          Dim IdPej As Long = Intermediario.IdPEJ
          Dim pejAux =   BSO.LstPEJ.Find (Function (x) x.PartidaEJId = IdPej)           
          sMsgError = "El intermediario " & pejAux.Intermediario.NombreIntermediario  & " no ha sido procesado: no hay importes para este intermediario u ocurrió algo inesperado en la generación del archivo."                    
          Return ESTADOTRANSDISTRIB.NO_EJECUTADA 
       End If


    Catch ex As Exception
      sMsgError = ex.Message      
      Return ESTADOTRANSDISTRIB.DESCONOCIDO 
    End Try



End Function

Public Function FondeoBancariosXIntermediario(ByRef Intermediario As CTDistribLiqReduc, ByRef ps As CTPartidaSolicitud, ByVal numInstrumento As Integer, ByRef ArchivoSal As String, ByRef SecuenciaArchivo As String, ByRef sMsgError As String, ByRef eventoBit As CSBitEvento) As  ESTADOTRANSDISTRIB

Dim sFechaSol     as String 
Dim sFechaLiq     as String 
ArchivoSal = ""    


 sFechaSol = Ps.FecSol.ToString ("dd-MM-yyyy")
 sFechaLiq = Ps.FecLiq.ToString ("dd-MM-yyyy")

 Try

       If  GenerarArchivoFondeoBancarios (intermediario, _
                                          numInstrumento, _
                                          ArchivoSal, _
                                          sFechaSol, _
                                          ps, SecuenciaArchivo, eventoBit) = 0 then 

                
           If  ejecutarProceso(RUTAARCHIVO  & TLOADERCOMMAND, PARAMTLOADERBANC.Replace("@Usuario", USUARIOTLOADER).Replace("@Archivo",RUTAARCHIVO & ArchivoSal), eventoBit) =False 
               sMsgError = "Fallo en el envio a Decalog."
               Return ESTADOTRANSDISTRIB.NO_EJECUTADA 
           End If


            Return ESTADOTRANSDISTRIB.ENVIADA_A_DECALOG 

        else
          Dim IdPej As Long = Intermediario.IdPEJ
          Dim pejAux =   BSO.LstPEJ.Find (Function (x) x.PartidaEJId = IdPej)           
          sMsgError = "El intermediario " & pejAux.Intermediario.NombreIntermediario  & " no ha sido procesado: no hay importes para este intermediario u ocurrió algo inesperado en la generación del archivo."                    
          Return ESTADOTRANSDISTRIB.NO_EJECUTADA 
       End If


    Catch ex As Exception
      sMsgError = ex.Message      
      Return ESTADOTRANSDISTRIB.DESCONOCIDO 
    End Try



End Function

Public Function  AlmacenarInfoDistribXIntermediario(ByRef Intermediario As CTDistribLiqReduc, ByRef sMsgError As String) As Boolean 

   Return CFLServicioLocalSQLServerDB.AlmacenarInfoDistribPEJ(Intermediario,sMsgError )
End Function




Public Function ObtieneDistNoEnviada(ByVal idPs As Integer) As DataTable
    Dim dtDatos       As New DataTable()
    Dim query As String = ""
    Dim sMsgError As String = ""

    Try
        dtDatos = CFLServicioLocalSQLServerDB.ObtieneIntermediariosTasa(idPS)
        dtDatos = CFLServicioLocalSQLServerDB.ObtieneDistribucion(dtDatos, idPS)
        Return dtDatos
    Catch ex As Exception
        Throw ex
    End Try
End Function

Public Function ActualizaArchivoEstatusDecalog(ByVal idPej As Integer, ByVal sec As Integer, ByRef nomArchivo As String, ByRef sMsgError As String) As Boolean 

   Return CFLServicioLocalSQLServerDB.ActualizaArchivoEstatusDecalog(idPej, sec, nomArchivo, sMsgError)
End Function

Public Function ObtieneEstatusEnvioDecalog(ByVal idPej As Integer, ByVal sec As Integer) As Boolean 
   Return CFLServicioLocalSQLServerDB.ObtieneEstatusEnvioDecalog(idPej, sec)
End Function

Public Function ObtieneEstatusEnvioDecalogPS(ByVal idPs As Integer) As Boolean 
   If CFLServicioLocalSQLServerDB.ObtieneEstatusEnvioDecalogPS(idPs) > 0 Then
        Return True
   Else
        Return False
   End If
End Function


#Region "RECUPERACIÓN DE FOLIOS DECALOG"


 Public Function ObtenerInfoEstatusRegGral(ByVal fechaIni As String, ByVal fechaFin As String, ByRef sMsgError As String) As List(Of CTFolioRecupDecalogConsulta )
 
 Dim lstInfo = New List(Of CTFolioRecupDecalogConsulta)
 Dim dtInfoGral As DataTable 
 


 Try

 
 dtInfoGral = CFLServicioLocalSQLServerDB.ObtenerPEDDistribGeneral(fechaIni,fechaFin,sMsgError) 
 If Not sMsgError.Equals("") then 
   Return lstInfo
 End If




 For Each reg As DataRow In dtInfoGral.Rows 

      Dim infoDistrib = New  CTFolioRecupDecalogConsulta ()

      With  infoDistrib

            
            .IdPS              = reg("ID_PARTIDA_PS")
            .IdPEJ             = reg("ID_PARTIDA_EJ")
            .Secuencia         = reg("SEC_DISTRIB")
            .FecReg            = reg("FEC_REGISTRO")
            .TVNG              = reg("TVNG")
            .Plazo             = reg("PLAZO")
            .MontoPS           = reg("CANTIDAD_SOL")
            .Intermediario     = reg("INTERMEDIARIO")
            .MontoDistrib      = reg("CANTIDAD_DISTRIBUIDA")
            .Tasa              = reg("TASA")

             If reg("FLEXIBLE") = 0 then 
                .Flexible = "No"
             else
                .Flexible = "Si"
             End If

             If reg("ENVIADO_DECALOG") = 0 then 
                .EnvioDec = "No"
             else
                .EnvioDec = "Si"
             End If


            .FolioOrden        = reg("FOLIO_ORDEN")
            .NomArchivo        = reg("NOM_ARCHIVO")
            .ObservacionEnvDec = reg("OBSERVACION_ENV_DEC")
            .Estatus           = reg("ESTATUS")



      End With


      lstInfo.Add(infoDistrib)

 Next


 Catch ex As Exception
    sMsgError = ex.Message    
 End Try


  Return lstInfo

 End Function


 Public Function RecuperarFoliosDecalog(ByVal fechaIni As String, ByVal fechaFin As String, ByRef sMsgErrorProc As String, ByRef  eventoBit As CSBitEvento) As Boolean 

    Dim dt        As DataTable       

    Dim sMsgError As String = ""
    Dim folioDec  As String = ""

 
    Dim lstProcesamiento = new List(Of CTDistribucionGL)
    



 Try
    dt = CFLServicioLocalSQLServerDB.ObtenerPEDDistribParaActualizarFolioDec (fechaIni,fechaFin,sMsgError,eventoBit)   
    If dt is Nothing then 
       Return False 
    End If


    
    For Each registro As DataRow  In dt.Rows           
        
        Dim folAux = New  CTDistribucionGL ()
        
        folAux.PartidaEJ = registro("ID_PARTIDA_EJ")
        folAux.SecDistrib = registro("SEC_DISTRIB")
        
       eventoBit.GuadarDetalle ("PEJ-SEC-ARCHIVO", folAux.PartidaEJ & " - " & folAux.SecDistrib & " - " & registro("NOM_ARCHIVO")) 
       
       
       Select case  ValidarEjecucionTLoader(RUTAARCHIVO,registro("NOM_ARCHIVO"),eventoBit)


          Case CTFolioRecupDecalogConsulta.EstatusProcDecalog.PROCESADO_CORRECTO, CTFolioRecupDecalogConsulta.EstatusProcDecalog.PENDIENTE 
                    
               Dim folio As String =    ObtenerFolioDecalogArchivo (RUTAARCHIVO,registro("NOM_ARCHIVO"),sMsgError)                  

               folAux.FolioOrden = folio 

               If Not sMsgError.Equals ("") then                                                                  
                  folAux.Observacion = sMsgError 
                  folAux.EstatusRecupFolDec = CTDistribucionGL.enumEstatusFolioRecupDecalog.NO_RECUPERADO    
              else
                 folAux.Observacion = ""
                 folAux.EstatusRecupFolDec = CTDistribucionGL.enumEstatusFolioRecupDecalog.RECUPERADO                   
              End If

               sMsgError = ""
                   
          Case CTFolioRecupDecalogConsulta.EstatusProcDecalog.PROCESADO_INCORRECTO 

             Dim mensaje As String = ObtenerErrorDecalogArchivo (RUTAARCHIVO,registro("NOM_ARCHIVO"),eventoBit)
             folAux.Observacion = mensaje 
             folAux.EstatusRecupFolDec =  CTDistribucionGL.enumEstatusFolioRecupDecalog.CON_ERROR 

       End Select 
                      
       lstProcesamiento.Add(folAux)                                           
    Next
   

    If lstProcesamiento.Count > 0 then
       eventoBit.GuadarDetalle ("ActualizarFoliosDecalogDB-> Num_PEJ:",lstProcesamiento.Count.ToString ()  ) 
       IF CFLServicioLocalSQLServerDB.ActualizarFoliosDecalogDB(lstProcesamiento,sMsgErrorProc) = True then 
           return  true
       else
          Dim detError =    eventoBit.GuardarError (sMsgErrorProc)     
          detError.GuardarDetalle ("PUNTO_DE_ERROR","Al actualizar los folios: %ActualizarFoliosDecalogDB%")
          Return false
       End If

         
    else
       Return true
    End If              

 Catch ex As Exception    

      Dim detError =    eventoBit.GuardarError (ex.Message)     
      detError.GuardarDetalle ("PUNTO_DE_ERROR","Catch general del proceso: %RecuperarFoliosDecalog%")
     
     sMsgErrorProc= ex.Message 
     Return False 
 End Try
 
 End Function

Public Function MensajeValidacionCierrePS(ByVal idPs As Long) As String
    Dim mensaje = New StringBuilder("")

    Try
        Dim dtDatos As DataTable = CFLServicioLocalSQLServerDB.IntermPorDistribuir(idPs)

        If dtDatos.Rows.Count > 0 Then
                mensaje.AppendLine
                mensaje.Append("Falta por distribuir:")
                mensaje.AppendLine
            For Each dt As DataRow In dtDatos.Rows
                mensaje.Append(Convert.ToString(dt("VALOR")) & " - " & Convert.ToDouble(dt("TASA")).ToString("0.0000") & "% Monto: " & Convert.ToDouble(dt("CANTIDAD_X_DISTRIB")).ToString("#,##0.00"))
                mensaje.AppendLine
            Next
        End If

        dtDatos = CFLServicioLocalSQLServerDB.OrdenesSinEnvioDecalog(idPs)

        If dtDatos.Rows.Count > 0 Then
                mensaje.AppendLine
                mensaje.Append("Falta por generar ordenes en Decalog:")
                mensaje.AppendLine
            For Each dt As DataRow In dtDatos.Rows
                mensaje.Append(Convert.ToString(dt("VALOR")) & " - " & Convert.ToDouble(dt("TASA")).ToString("0.0000") & "% Monto: " & Convert.ToDouble(dt("CANTIDAD_DISTRIBUIDA")).ToString("#,##0.00"))
                mensaje.AppendLine
            Next
        End If

        'dtDatos = CFLServicioLocalSQLServerDB.OrdenesSinFolio(idPs)

        'If dtDatos.Rows.Count > 0 Then
        '        mensaje.AppendLine
        '        mensaje.Append("Falta de actualizar folio de Decalog:")
        '        mensaje.AppendLine
        '    For Each dt As DataRow In dtDatos.Rows
        '        mensaje.Append(Convert.ToString(dt("VALOR")) & " - " & Convert.ToDouble(dt("TASA")).ToString("0.0000") & "% Monto: " & Convert.ToDouble(dt("CANTIDAD_DISTRIBUIDA")).ToString("#,##0.00"))
        '        mensaje.AppendLine
        '    Next
        'End If

    Catch ex As Exception                
        Throw ex
    End Try

        
        
    Return mensaje.ToString()
End Function

Public Function ObtenerFolioDecalogArchivo(ByVal rutaArchivo  As String, ByVal archivoProc As String, ByRef sMsgError As String ) As String

Dim datos As String 
Dim folio As String = ""
Dim inicioIdx As Integer 
Dim finIdx As Integer 

Try

    Using sw As StreamReader  = File.OpenText (rutaArchivo & archivoProc & __ARCHIVO_TLOK_TEXT__  )
       datos = sw.ReadLine()             
       sw.Close()
    End Using

    inicioIdx = datos.IndexOf ("=")
    finIdx = datos.IndexOf ("(")

    If inicioIdx > 0 and finIdx > 0 then 
       folio =  datos.Substring (inicioIdx + 1,finIdx-inicioIdx-1).Trim () 
    End If 
    
    return folio 
Catch ex As Exception   

   sMsgError = ex.Message 
   Return ""
End Try

End Function


Public Function ObtenerErrorDecalogArchivo(ByVal rutaArchivo  As String, ByVal archivoProc As String, ByRef eventoBit As CSBitEvento ) As String

Dim folio As String = ""

Dim mensaje = New StringBuilder ()

Try

    Using sw As StreamReader  = File.OpenText (rutaArchivo & archivoProc & __ARCHIVO_TLERR_TEXT__  )
        While sw.Peek >-1
          mensaje.Append(sw.ReadLine())
        End While       
       sw.Close()
    End Using
             
    return mensaje.ToString () 

Catch ex As Exception
   eventoBit.GuardarError (ex.Message)      
   Return ""
End Try

End Function



Public Function ValidarEjecucionTLoader(ByVal rutaArchivo  As String, ByVal archivoProc As String,ByRef eventoBit As CSBitEvento ) As CTFolioRecupDecalogConsulta.EstatusProcDecalog  

  Dim infoTLOK      As System.IO.FileInfo
  Dim infoTLERRText As System.IO.FileInfo

  Dim archivoTLOK      As String  =  rutaArchivo & archivoProc & __ARCHIVO_TLOK__      
  Dim archivoTLERRText As String  =  rutaArchivo & archivoProc & __ARCHIVO_TLERR_TEXT__ 
  Dim archivoFolDec    As String  =  rutaArchivo & archivoProc & __ARCHIVO_TLOK_TEXT__ 

  Try

      If  My.Computer.FileSystem.FileExists (archivoTLOK) and My.Computer.FileSystem.FileExists (archivoTLERRText) then 

           infoTLOK = My.Computer.FileSystem.GetFileInfo(archivoTLOK)
           infoTLERRText = My.Computer.FileSystem.GetFileInfo(archivoTLERRText)

           If infoTLERRText.Length  = 0 and  infoTLOK.Length <> 0 then 
              Return  CTFolioRecupDecalogConsulta.EstatusProcDecalog.PROCESADO_CORRECTO 
           else
              Return CTFolioRecupDecalogConsulta.EstatusProcDecalog.PROCESADO_INCORRECTO 
           End If

      else

          Return CTFolioRecupDecalogConsulta.EstatusProcDecalog.PENDIENTE 

      End If
           
  Catch ex As Exception 
     eventoBit.GuardarError (archivoProc & " -> " & ex.Message)         
     Return CTFolioRecupDecalogConsulta.EstatusProcDecalog.PENDIENTE 
  End Try
  
End Function




#End Region





#Region "CONSULTA DE SALDOS"



Public Function ObtenerFondosTVNG(ByVal idTVNG As Integer, ByRef sMsgError As String) As List(Of String)
  Dim lstFondos = New  List(Of String)

  Dim dt As DataTable = CFLServicioLocalSQLServerDB.ObtenerFondosXTVNGDB (idTVNG, sMsgError) 

  If Not sMsgError.Equals("") then 
     Return Nothing 
  End If

  For Each fondo As DataRow In dt.Rows
     lstFondos.Add(fondo("FONDO"))
  Next

  Return lstFondos
End Function

Public Function ObtenerSaldosXFondo(ByRef lstFondos As list (Of string), _
                                    ByRef SaldoEstimado As CTDistribLiqReduc, _ 
                                    ByRef distrib As CTDistribLiqReduc, _
                                    ByRef lstComisiones As List(Of CTComisionFondo) ) As List(Of CTFondosDistribLiq)



Dim lstFondosInter        As New List(Of CTFondosDistribLiq)

Dim dtFondoSalDiso        As New DataTable()
Dim dtOrdenesPend         As New DataTable()
Dim dtPendingCashAndAjust As New DataTable()

Dim strTipoActMinus       As String = "PE-"
Dim strTipoActPlus        As String = "PE+"

Dim ToleranciaRemMinXFondo  As Decimal 



Dim servicioGral As New CServiciosGenerales() 


  '1) Se obtiene el monto de Tolerancia de Remanente Mínimo X Fondo

     Try
         ToleranciaRemMinXFondo = Convert.ToDecimal (  CServicioLocalSQLServerDB.ObtenerTolRemMinXFondo()  )
     Catch ex As Exception
         ToleranciaRemMinXFondo = __MONTO_TOLERANCIA_REMAMENTE_MINIMO_X_FONDO__
     End Try
     
     

   '2) Se Obtiene el Saldo de los fondos
    Try       
         dtFondoSalDiso = CServiciosMacrosSyBaseDB.FondosSalLiquidezDB(lstFondos)       
    Catch ex As Exception       
        Throw ex
    End Try




    '3) Se obtiene las ordenes pendientes 

    Dim ColumnaClavesOrd(0) As DataColumn
    Try
       
       dtOrdenesPend = CServiciosMacrosSyBaseDB.OrdenesPendLiquidezDB(lstFondos)
       ColumnaClavesOrd(0) = dtOrdenesPend.Columns("PFCOD")
       dtOrdenesPend.PrimaryKey = ColumnaClavesOrd      
    Catch ex As Exception       
       Throw ex
    End Try




    '4) Se obtiene el pending-cash-ajust

    Dim ColumnaClaves(1) As DataColumn
    Try
       
       dtPendingCashAndAjust = CServiciosMacrosSyBaseDB.PendingCashAndAjustDB(lstFondos)
       ColumnaClaves(0) = dtPendingCashAndAjust.Columns("PF_COD")
       ColumnaClaves(1) = dtPendingCashAndAjust.Columns("XACT_TYP")
       dtPendingCashAndAjust.PrimaryKey = ColumnaClaves
               
    Catch ex As Exception       
      Throw ex
    End Try



    

     Dim registro             As DataRow
     Dim dblSaldo             As Double = 0.0
     Dim dblPendingCash       As Double = 0.0
     Dim dblPendingCashAjust  As Double = 0.0
     Dim dblOrdPend           As Double = 0.0
     Dim dblSalDecalog        As Double = 0.0


     lstFondosInter.Clear()

    Try
    
     For Each registro In dtFondoSalDiso.Rows
             Dim valores(1) As Object
             Dim registrosMinus As DataRow
             Dim registrosPlus As DataRow
             Dim registroOrd As DataRow



             'Busqueda de registros
             valores(0) = registro.Item("fondo")
             valores(1) = strTipoActMinus
             registrosMinus = dtPendingCashAndAjust.Rows.Find(valores)

             valores(1) = strTipoActPlus
             registrosPlus = dtPendingCashAndAjust.Rows.Find(valores)

             registroOrd = dtOrdenesPend.Rows.Find(registro.Item("fondo"))


             'Validación en caso de no encontrar

             If Not registro.Item("saldo") Is Nothing Then
                 dblSaldo = registro.Item("saldo")
             End If


             If Not registrosMinus Is Nothing Then
                 dblPendingCash = registrosMinus.Item("SALDOSPLUSMINUS")
             End If

              If Not registrosPlus Is Nothing Then
                 dblPendingCashAjust = registrosPlus.Item("SALDOSPLUSMINUS")
             End If


              If Not registroOrd Is Nothing Then
                 dblOrdPend = registroOrd.Item("ORDREPO")
             End If


             'PENDIENTE: VALIDAR SI registro.Item("saldo") puede ser NULL
             dblSalDecalog = registro.Item("saldo") - dblOrdPend + dblPendingCash + dblPendingCashAjust



             'Obtener el monto distribuido 
             Dim montoDistribuido As Decimal = 0
             If Not distrib is Nothing then
                 Dim  montoFondo As CTDistribLiqReduc.structDistribFondoXInter    
                 montoFondo = distrib.LstDistrib.Find (Function (x) x.CodFondo.Equals (registro.Item("fondo")) )                
                 montoDistribuido = montoFondo.MontoDistrib                                 
             End If


             'Obtener comisiones (Cargo y/o Abonos)
             Dim ComisionFondo As CTComisionFondo = Nothing  
             Dim Cargo         As Decimal = 0  
             Dim Abono         As Decimal = 0

             If Not lstComisiones is Nothing then 
                If lstComisiones.Count > 0 then 
                   ComisionFondo = lstComisiones.Find(Function(x) x.Fondo.Equals(registro.Item("fondo"))) 
                End If
                If not ComisionFondo is Nothing 
                   Cargo = ComisionFondo.Cargo
                   Abono = ComisionFondo.Abono 
                End If
             End If



             lstFondosInter.Add(New CTFondosDistribLiq(registro.Item("fondo"), dblSaldo, dblOrdPend, dblPendingCash, dblPendingCashAjust, dblSalDecalog,SaldoEstimado,montoDistribuido,ToleranciaRemMinXFondo,Cargo,Abono))

             dblSaldo = 0.0
             dblPendingCash = 0.0
             dblPendingCashAjust = 0.0
             dblOrdPend = 0.0
             dblSalDecalog = 0.0

         Next

         

    Catch ex As Exception               
        Throw ex
    End Try

    
    Return lstFondosInter


End Function



#End Region





  


End Class



